package ui.graphic.maps; 

import java.awt.Dimension;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.Iterator;


public class MapData implements IMapData{ 
   ArrayList <Area> zonas = new ArrayList();
   ArrayList <Point> centros = new ArrayList();

    public MapData() {
        Path2D.Double perimetro = new Path2D.Double();
        
        Point p = new Point();
        
       // area 0 (start)
        perimetro.moveTo(571, 148);
        perimetro.lineTo(568, 174);
        perimetro.lineTo(549, 204);
        perimetro.lineTo(583, 213);
        perimetro.lineTo(579, 234);
        perimetro.lineTo(548, 258);
        perimetro.lineTo(503, 259);
        perimetro.lineTo(464, 290);
        perimetro.lineTo(459, 330);
        perimetro.lineTo(456, 365);
        perimetro.lineTo(446, 402);
        perimetro.lineTo(468, 414);
        perimetro.lineTo(472, 432);
        perimetro.lineTo(486, 436);
        perimetro.lineTo(514, 422);
        perimetro.lineTo(545, 430);
        perimetro.lineTo(566, 423);
        perimetro.lineTo(578, 398);
        perimetro.lineTo(611, 356);
        perimetro.lineTo(633, 331);
        perimetro.lineTo(650, 307);
        perimetro.lineTo(645, 268);
        perimetro.lineTo(646, 232);
        perimetro.lineTo(629, 216);
        perimetro.lineTo(627, 175);
        perimetro.lineTo(605, 153);
        perimetro.lineTo(593, 150);
        perimetro.lineTo(576, 144);
        zonas.add(new Area(perimetro));
        
        //Area 1
        perimetro.moveTo(648, 230);
        perimetro.lineTo(653, 305);
        perimetro.lineTo(618, 349);
        perimetro.lineTo(615, 392);
        perimetro.lineTo(667, 420);
        perimetro.lineTo(735, 399);
        perimetro.lineTo(798, 385);
        perimetro.lineTo(777, 331);
        perimetro.lineTo(742, 318);
        perimetro.lineTo(719, 280);
        perimetro.lineTo(712, 251);
        zonas.add(new Area(perimetro));
        //Area 2
        perimetro.moveTo(676, 423);
        perimetro.lineTo(652, 511);
        perimetro.lineTo(691, 547);
        perimetro.lineTo(784, 537);
        perimetro.lineTo(806, 514);
        perimetro.lineTo(838, 477);
        perimetro.lineTo(856, 446);
        perimetro.lineTo(818, 398);
        perimetro.lineTo(755, 405);
        zonas.add(new Area(perimetro));
        
        //Area 3
        perimetro.moveTo(525, 523);
        perimetro.lineTo(554, 568);
        perimetro.lineTo(641, 571);
        perimetro.lineTo(668, 425);
        perimetro.lineTo(618, 399);
        perimetro.lineTo(589, 444);
        perimetro.lineTo(565, 450);
        perimetro.lineTo(553, 476);
        perimetro.lineTo(541, 507);
        zonas.add(new Area(perimetro));
        
        //Area 4
        perimetro.moveTo(559, 578);
        perimetro.lineTo(648, 522);
        perimetro.lineTo(703, 562);
        perimetro.lineTo(685, 667);
        perimetro.lineTo(584, 666);
        perimetro.lineTo(560, 648);
        perimetro.lineTo(521, 646);
        perimetro.lineTo(525, 615);
        perimetro.lineTo(559, 595);
        zonas.add(new Area(perimetro));
        
        //Area 5
        perimetro.moveTo(697, 671);
        perimetro.lineTo(719, 558);
        perimetro.lineTo(788, 543);
        perimetro.lineTo(819, 518);
        perimetro.lineTo(848, 576);
        perimetro.lineTo(850, 615);
        perimetro.lineTo(859, 638);
        perimetro.lineTo(888, 634);
        perimetro.lineTo(891, 671);
        zonas.add(new Area(perimetro));
        
        //Area 6
        perimetro.moveTo(891, 433);
        perimetro.lineTo(860, 406);
        perimetro.lineTo(805, 388);
        perimetro.lineTo(791, 331);
        perimetro.lineTo(793, 291);
        perimetro.lineTo(825, 277);
        perimetro.lineTo(852, 288);
        perimetro.lineTo(870, 288);
        perimetro.lineTo(891, 274);
        zonas.add(new Area(perimetro));
        
        //Area 7
        perimetro.moveTo(892, 142);
        perimetro.lineTo(842, 157);
        perimetro.lineTo(818, 207);
        perimetro.lineTo(789, 197);
        perimetro.lineTo(753, 229);
        perimetro.lineTo(779, 284);
        perimetro.lineTo(823, 275);
        perimetro.lineTo(849, 280);
        perimetro.lineTo(883, 274);
        perimetro.lineTo(890, 269);
        zonas.add(new Area(perimetro));
        
        //Area 8
        perimetro.moveTo(891, 441);
        perimetro.lineTo(862, 445);
        perimetro.lineTo(832, 508);
        perimetro.lineTo(846, 557);
        perimetro.lineTo(863, 626);
        perimetro.lineTo(890, 628);
        zonas.add(new Area(perimetro));
        
         //Area 9
        perimetro.moveTo(891, 69);
        perimetro.lineTo(849, 105);
        perimetro.lineTo(802, 107);
        perimetro.lineTo(800, 44);
        perimetro.lineTo(834, 8);
        perimetro.lineTo(890, 8);
        zonas.add(new Area(perimetro));
        
        //Area 10
        perimetro.moveTo(698, 8);
        perimetro.lineTo(832, 5);
        perimetro.lineTo(795, 37);
        perimetro.lineTo(795, 106);
        perimetro.lineTo(759, 136);
        perimetro.lineTo(713, 142);
        perimetro.lineTo(679, 120);
        perimetro.lineTo(655, 91);
        perimetro.lineTo(678, 72);
        perimetro.lineTo(697, 8);
        zonas.add(new Area(perimetro));
        
        //Area 11
        perimetro.moveTo(667, 120);
        perimetro.lineTo(635, 126);
        perimetro.lineTo(594, 95);
        perimetro.lineTo(559, 92);
        perimetro.lineTo(547, 75);
        perimetro.lineTo(554, 32);
        perimetro.lineTo(577, 8);
        perimetro.lineTo(690, 6);
        perimetro.lineTo(672, 72);
        perimetro.lineTo(656, 87);
        perimetro.lineTo(653, 101);
        zonas.add(new Area(perimetro));
        
        //Area 12
        perimetro.moveTo(427, 69);
        perimetro.lineTo(418, 117);
        perimetro.lineTo(407, 138);
        perimetro.lineTo(384, 151);
        perimetro.lineTo(369, 192);
        perimetro.lineTo(393, 209);
        perimetro.lineTo(458, 218);
        perimetro.lineTo(489, 207);
        perimetro.lineTo(500, 167);
        perimetro.lineTo(489, 120);
        perimetro.lineTo(449, 88);
        zonas.add(new Area(perimetro));
        
        //Area 13
        perimetro.moveTo(415, 83);
        perimetro.lineTo(417, 122);
        perimetro.lineTo(386, 148);
        perimetro.lineTo(369, 192);
        perimetro.lineTo(310, 167);
        perimetro.lineTo(302, 121);
        perimetro.lineTo(369, 81);
        perimetro.lineTo(424, 67);
        zonas.add(new Area(perimetro));
        
        //Area 14
        perimetro.moveTo(172, 54);
        perimetro.lineTo(197, 45);
        perimetro.lineTo(206, 71);
        perimetro.lineTo(233, 85);
        perimetro.lineTo(234, 125);
        perimetro.lineTo(200, 159);
        perimetro.lineTo(136, 166);
        perimetro.lineTo(117, 149);
        perimetro.lineTo(134, 87);
        perimetro.lineTo(151, 82);
        zonas.add(new Area(perimetro));
        
        //Area 15
        perimetro.moveTo(129, 168);
        perimetro.lineTo(112, 173);
        perimetro.lineTo(47, 112);
        perimetro.lineTo(54, 79);
        perimetro.lineTo(94, 53);
        perimetro.lineTo(123, 39);
        perimetro.lineTo(165, 53);
        perimetro.lineTo(117, 149);
        perimetro.lineTo(149, 78);
        perimetro.lineTo(133, 85);
        perimetro.lineTo(111, 130);
        perimetro.lineTo(113, 152);
        zonas.add(new Area(perimetro));
        
        //Area 16
        perimetro.moveTo(4, 449);
        perimetro.lineTo(28, 449);
        perimetro.lineTo(45, 457);
        perimetro.lineTo(139, 427);
        perimetro.lineTo(160, 380);
        perimetro.lineTo(132, 362);
        perimetro.lineTo(120, 327);
        perimetro.lineTo(132, 290);
        perimetro.lineTo(149, 286);
        perimetro.lineTo(150, 248);
        perimetro.lineTo(119, 243);
        perimetro.lineTo(100, 221);
        perimetro.lineTo(31, 256);
        perimetro.lineTo(3, 303);
        zonas.add(new Area(perimetro));
        
        //Area 17
        perimetro.moveTo(124, 325);
        perimetro.lineTo(130, 359);
        perimetro.lineTo(161, 377);
        perimetro.lineTo(201, 369);
        perimetro.lineTo(219, 376);
        perimetro.lineTo(237, 382);
        perimetro.lineTo(271, 381);
        perimetro.lineTo(286, 379);
        perimetro.lineTo(306, 380);
        perimetro.lineTo(320, 365);
        perimetro.lineTo(329, 352);
        perimetro.lineTo(338, 348);
        perimetro.lineTo(327, 335);
        perimetro.lineTo(310, 333);
        perimetro.lineTo(308, 325);
        perimetro.lineTo(326, 315);
        perimetro.lineTo(336, 275);
        perimetro.lineTo(322, 254);
        perimetro.lineTo(308, 249);
        perimetro.lineTo(294, 229);
        perimetro.lineTo(252, 234);
        perimetro.lineTo(236, 228);
        perimetro.lineTo(207, 240);
        perimetro.lineTo(200, 265);
        perimetro.lineTo(148, 323);
        zonas.add(new Area(perimetro));
        
        //Area 18
        perimetro.moveTo(4, 451);
        perimetro.lineTo(24, 450);
        perimetro.lineTo(42, 458);
        perimetro.lineTo(119, 432);
        perimetro.lineTo(140, 433);
        perimetro.lineTo(158, 438);
        perimetro.lineTo(169, 450);
        perimetro.lineTo(194, 460);
        perimetro.lineTo(222, 527);
        perimetro.lineTo(209, 541);
        perimetro.lineTo(195, 542);
        perimetro.lineTo(155, 558);
        perimetro.lineTo(140, 553);
        perimetro.lineTo(135, 549);
        perimetro.lineTo(102, 548);
        perimetro.lineTo(83, 561);
        perimetro.lineTo(58, 575);
        perimetro.lineTo(29, 571);
        perimetro.lineTo(3, 566);
        zonas.add(new Area(perimetro));

        //Area 19
        perimetro.moveTo(158, 381);
        perimetro.lineTo(151, 394);
        perimetro.lineTo(141, 426);
        perimetro.lineTo(155, 428);
        perimetro.lineTo(166, 443);
        perimetro.lineTo(178, 449);
        perimetro.lineTo(195, 453);
        perimetro.lineTo(202, 461);
        perimetro.lineTo(216, 486);
        perimetro.lineTo(222, 512);
        perimetro.lineTo(232, 537);
        perimetro.lineTo(249, 546);
        perimetro.lineTo(282, 541);
        perimetro.lineTo(300, 525);
        perimetro.lineTo(317, 508);
        perimetro.lineTo(321, 486);
        perimetro.lineTo(336, 465);
        perimetro.lineTo(323, 434);
        perimetro.lineTo(304, 436);
        perimetro.lineTo(278, 431);
        perimetro.lineTo(268, 409);
        perimetro.lineTo(272, 389);
        perimetro.lineTo(279, 381);
        perimetro.lineTo(249, 381);
        perimetro.lineTo(223, 379);
        perimetro.lineTo(206, 372);
        perimetro.lineTo(185, 376);
        perimetro.lineTo(166, 382);
        zonas.add(new Area(perimetro));

        //Area 20
        perimetro.moveTo(2, 572);
        perimetro.lineTo(3, 572);
        perimetro.lineTo(52, 580);
        perimetro.lineTo(95, 553);
        perimetro.lineTo(125, 552);
        perimetro.lineTo(147, 561);
        perimetro.lineTo(162, 565);
        perimetro.lineTo(168, 587);
        perimetro.lineTo(170, 600);
        perimetro.lineTo(166, 616);
        perimetro.lineTo(172, 630);
        perimetro.lineTo(180, 642);
        perimetro.lineTo(187, 645);
        perimetro.lineTo(196, 658);
        perimetro.lineTo(195, 667);
        perimetro.lineTo(195, 672);
        perimetro.lineTo(3, 669);
        zonas.add(new Area(perimetro));
        
        //Area 21
        perimetro.moveTo(198, 670);
        perimetro.lineTo(316, 670);
        perimetro.lineTo(306, 642);
        perimetro.lineTo(316, 622);
        perimetro.lineTo(308, 577);
        perimetro.lineTo(289, 562);
        perimetro.lineTo(282, 543);
        perimetro.lineTo(238, 541);
        perimetro.lineTo(227, 533);
        perimetro.lineTo(210, 541);
        perimetro.lineTo(158, 557);
        perimetro.lineTo(169, 574);
        perimetro.lineTo(172, 598);
        perimetro.lineTo(170, 617);
        perimetro.lineTo(179, 637);
        perimetro.lineTo(189, 642);
        perimetro.lineTo(195, 652);
        zonas.add(new Area(perimetro));

        //Area 22
        perimetro.moveTo(288, 540);
        perimetro.lineTo(320, 511);
        perimetro.lineTo(341, 509);
        perimetro.lineTo(362, 529);
        perimetro.lineTo(366, 552);
        perimetro.lineTo(391, 559);
        perimetro.lineTo(402, 555);
        perimetro.lineTo(442, 615);
        perimetro.lineTo(440, 669);
        perimetro.lineTo(322, 671);
        perimetro.lineTo(309, 645);
        perimetro.lineTo(322, 619);
        perimetro.lineTo(312, 579);
        perimetro.lineTo(302, 566);
        zonas.add(new Area(perimetro));
        
        centros.add(new Point(883, 491));
        centros.add(new Point(1135, 526));
        centros.add(new Point(1230, 715));
        centros.add(new Point(978, 728));
        centros.add(new Point(1025, 916));
        centros.add(new Point(1272, 917));
        centros.add(new Point(1398, 538));
        centros.add(new Point(1380, 345));
        centros.add(new Point(1430, 790));
        centros.add(new Point(1386, 80));
        centros.add(new Point(1205, 86));
        centros.add(new Point(1001, 74));
        centros.add(new Point(729, 236));
        centros.add(new Point(578, 192));
        centros.add(new Point(289, 170));
        centros.add(new Point(140, 143));
        centros.add(new Point(89, 527));
        centros.add(new Point(397, 452));
        centros.add(new Point(134, 748));
        centros.add(new Point(399, 683));
        centros.add(new Point(131, 952));
        centros.add(new Point(396, 933));
        centros.add(new Point(594, 925));
       
       
    }

        

    @Override
    public Area getFigura(Point p) {
         for (int i = 0; i < zonas.size(); i++) {
            if(zonas.get(i).contains(p)){
                return zonas.get(i);
            }
        }
       return null;
    }

    @Override
    public int getIndice(Point p) {
        for (int i = 0; i < zonas.size(); i++) {
            if(zonas.get(i).contains(p)){
                return i;
            }
        }
       return -1;
    }

    public void resizeArea(AffineTransform t){
        for (int i = 0; i < zonas.size(); i++) {
            zonas.set(i, zonas.get(i).createTransformedArea(t));
        }
    }
 
    public Point getCentro(int i){
        return centros.get(i);
    }
    
    public void resizeCentros(double dx, double dy){
        for (int i = 0; i < centros.size(); i++) {
            float x = (float) (centros.get(i).getX()*dx);
            float y= (float) (centros.get(i).getY()*dy);
            Point aux = new Point((int)x,(int)y);
            centros.set(i, aux);
        }
    }
    
    
} 